var read_line = require('readline-sync')
read_line.setDefaultOptions({ prompt: '' })
var read_line = read_line.prompt
let t = parseInt(read_line())  // 读出数据的组数
for (let i = 0; i < t; i++) {
  let [n, p] = read_line().split(' ').map((item) => parseInt(item)) // 读出这个字符串的长度 和周期p
  let s = read_line().split('') // 读出这个字符串s的数组形式
  // 找到这个最小的改变次数  周期是p 长度是n 那么就是说每p个都是一样的而且还得是回文的
  // 先把这个字符串改成回文的 记录要多少次
  let map = {} // 建立一个hash表
  for (let i of s) { // 遍历每一个字符
    map[i] = (map[i] || 0) + 1 // 统计每个出现的次数
  }
  let ans = 0 // 操作数
  for (let left = 0, right = s.length - 1; left < right; left++, right--) { // 从两边向中间
    if (s[left] !== s[right]) { // 如果两个不相同 那就修改一下这个出现次数少的为出现次数大的
      ans++ // 操作数+1
      if (map[s[left]] < map[s[right]]) { // 如果左边的次数小于右边的次数 就修改左边的为右边的
        s[left] = s[right]
        map[s[left]]--
        map[s[right]]++ // 左边的个数-1 右边的+1
      } else if (map[s[left]] >= map[s[right]]) {
        s[right] = s[left]
        map[s[left]]++
        map[s[right]]--
      }
    }
  } // 遍历完形成回文的次数 这个时候就形成了回文串
  // 然后去判断这个的形成周期穿的次数
  for (let startP = 0; startP < p; startP++) {  // 遍历p个
    let map1 = {}
    for (let start = 0; start < s.length; start += p) { // 周期是p
      map1[s[start]] = (map1[s[start]] || 0) + 1 // 统计个数
    }
    let maxKey = 0
    for (let key in map1) { // 遍历这个map1中的每个key 统计一个最大的key
      if (map1[key] > maxKey) {
        maxKey = map1[key] // 得到这个最大的key出现的次数
      }
    }
    ans += ((n / p) - maxKey) // 这个的循环的次数-最大的
  }
  console.log(ans)
}